package com.jic.point.controller;
import com.alibaba.fastjson.JSONObject;
import com.github.pagehelper.PageInfo;
import com.jic.common.base.vo.RestResult;
import com.jic.point.constant.consist.ResponseCode;
import com.jic.point.exception.AppRuntimeException;
import com.jic.point.model.entity.ConfThirdPart;
import com.jic.point.model.entity.ConfThirdPartApply;
import com.jic.point.model.vo.request.ConfThirdPartRequest;
import com.jic.point.model.vo.response.ConfThirdPartResponse;
import com.jic.point.service.ConfThirdPartApplyService;
import com.jic.point.service.ConfThirdPartService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.stream.Collectors;
/**
 * @Author: tzc
 * @date: 2020-10-11 17:28:33
 */
 @RestController
 @Slf4j
 @RequestMapping("/confThirdPart")
 @Api(tags = " [第三方机构主表]控制类-PC")
public class ConfThirdPartController {
         //主表
        @Autowired
        private ConfThirdPartService service;

        //申请表
        @Autowired
        private ConfThirdPartApplyService services;
         /**
          *新增记录
          * @param request 新增[第三方机构主表]请求参数
          * @return ConfThirdPartResponse 新增[第三方机构主表]响应参数
          * author tzc
          * @date 2020-3-11 20:54:04
          */
        @ApiOperation(value = "新增[第三方机构主表]记录")
        @PostMapping("/save")
        @ResponseBody
        public RestResult<Long> save(@RequestBody ConfThirdPartRequest request) throws Throwable {
                ConfThirdPart confThirdPart = new ConfThirdPart();
                BeanUtils.copyProperties(request, confThirdPart);
                long flag = service.save(confThirdPart);
         return RestResult.success(flag);
        }

         /**
          * 新增或修改记录
          * @param request 新增或修改[第三方机构主表]请求参数
          * @return ConfThirdPartResponse 新增或修改[第三方机构主表]响应参数
          * author tzc
          * @date 2020-3-11 20:54:04
          */
         @ApiOperation(value = "保存或更新[第三方机构主表]")
         @PostMapping("/saveOrUpdate")
          @ResponseBody
         public RestResult<Long> saveOrUpdate( @RequestBody ConfThirdPartRequest request) throws Throwable {
                ConfThirdPart confThirdPart = new ConfThirdPart();
                 BeanUtils.copyProperties(request, confThirdPart);
                 long flag =   service.saveOrUpdate(confThirdPart);
                 return RestResult.success(flag);
         }

         /**
          * 删除记录
          * @param request 删除[第三方机构主表]请求参数
          * @return ConfThirdPartResponse 删除[第三方机构主表]响应参数
          * author tzc
          * @date 2020-3-11 20:54:04
          */
         @ApiOperation(value = "删除[第三方机构主表]记录")
         @PostMapping("/delete")
         @ResponseBody
         public RestResult<Long> delete(@RequestBody ConfThirdPartRequest request) throws Throwable {
             ConfThirdPart confThirdPart = new ConfThirdPart();
             BeanUtils.copyProperties(request, confThirdPart);
             ConfThirdPart result = service.getByPrimaryKey(confThirdPart);
            //主表逻辑删除
             service.deleteByPrimaryKeyLogically(confThirdPart);
            //操作人
             result.setAuditorId(request.getAdminOperate().getOperator());
             //设置当前动作
             result.setCurrentAction(2);
             //插入到申请表中
             ConfThirdPartApply confThirdPartApply = new ConfThirdPartApply();
             BeanUtils.copyProperties(result, confThirdPartApply);
             long flag =   services.insertSelective(confThirdPartApply);
             return RestResult.success(flag);

         }

         /**
          * 修改记录
          * @param request 修改[第三方机构主表]请求参数
          * @return ConfThirdPartResponse 修改[第三方机构主表]响应参数
          * author tzc
          * @date 2020-3-11 20:54:04
          */
         @ApiOperation(value = "修改[第三方机构主表]记录")
         @PostMapping("/update")
         @ResponseBody
         public RestResult<Long> update(@RequestBody ConfThirdPartRequest request) throws Throwable {
                ConfThirdPart confThirdPart = new ConfThirdPart();
                BeanUtils.copyProperties(request, confThirdPart);
                 long flag = service.updateByPrimaryKeySelective(confThirdPart);
          return RestResult.success(flag);
         }

         /**
          * 单表查询详情信息
          * @param request 查询[第三方机构主表]详情请求参数
          * @return ConfThirdPartResponse 查询[第三方机构主表]详情响应参数
          * author tzc
          * @date 2020-3-11 20:54:04
          */
          @PostMapping("/getByPrimaryKey")
          @ApiOperation(value = "查询[第三方机构主表]详情")
          @ResponseBody
         public RestResult<ConfThirdPartResponse> getByPrimaryKey(@Validated  @RequestBody ConfThirdPartRequest request) {
            log.info("查询详情请求参数入参，{}", JSONObject.toJSONString(request));
             if (request!=null && request.getId()!=null) {

                ConfThirdPart confThirdPart = new ConfThirdPart();
                BeanUtils.copyProperties(request, confThirdPart);
                ConfThirdPart result = service.getByPrimaryKey(confThirdPart);
                 log.info("查询详情请求参数出参，{}", JSONObject.toJSONString(result));
                 if (result == null) {
                    return RestResult.error(ResponseCode.EXCEPTION, "记录不存在");
                 }
                 ConfThirdPartResponse bo = new ConfThirdPartResponse();
                 BeanUtils.copyProperties(result, bo);
                return RestResult.success(bo);
             }
            log.info("查询详情请求结束");
             return RestResult.success(new ConfThirdPartResponse());
         }

        /**
          * 分页查询
          *
          * @param request 分页查询请求参数
          * @return 分页列表
          * @throws Throwable 业务异常和系统异常
          */
         @PostMapping("/listPage")
         @ApiOperation(value = " 分页查询列表 ")
         @ResponseBody
         public RestResult<PageInfo<ConfThirdPart>> listPage (@RequestBody ConfThirdPartRequest request) throws Throwable {
          ConfThirdPart param = new ConfThirdPart();
          BeanUtils.copyProperties(request, param);
          param.setDeleteFlag(0);
         return RestResult.success(service.listPageBySelective(param, request.getPageNum(),request.getPageSize()));
         }
    /**
     * 分页查询
     *
     * @param request 分页查询冻结的数据请求参数
     * @return 分页冻结的数据列表
     * @throws Throwable 业务异常和系统异常
     */
    @PostMapping("/frozenListPage")
    @ApiOperation(value = " 分页查询列表 ")
    @ResponseBody
    public RestResult<PageInfo<ConfThirdPart>> frozenlistPage (@RequestBody ConfThirdPartRequest request) throws Throwable {
        ConfThirdPart param = new ConfThirdPart();
        BeanUtils.copyProperties(request, param);
        return RestResult.success(service.frozenListPageBySelective(param, request.getPageNum(),request.getPageSize()));
    }

          /**
           *CONF_THIRD_PART 查询列表（不分页）
           * @param  request 前端请求参数
           */
          @PostMapping("/listAll")
          @ApiOperation(value = "不分页查询 [第三方机构主表] ")
          @ResponseBody
          public RestResult<List<ConfThirdPartResponse>>  listConfThirdPartAllRecord(@RequestBody ConfThirdPartRequest request) throws Throwable {
                ConfThirdPart param = new ConfThirdPart();
                BeanUtils.copyProperties(request, param);
                param.setDeleteFlag(0);
                List<ConfThirdPart> list = service.listAllRecord(param);
                List<ConfThirdPartResponse> responseList = list.stream().map(temp -> {
                ConfThirdPartResponse bo = new ConfThirdPartResponse();
                BeanUtils.copyProperties(temp, bo);
                return bo;
                }).filter(item -> item != null).collect(Collectors.toList());
                return RestResult.success(responseList);
          }

        /**
         * 冻结申请&&解冻申请
         */
        @PostMapping("/freezeApplication")
        @ResponseBody
        public RestResult<Long> freezeApplication(@Validated @RequestBody ConfThirdPartRequest request) throws Throwable{
            log.info("查询冻结与解冻参数入参，{}", JSONObject.toJSONString(request));
            //根据id查询到信息
            ConfThirdPart confThirdPart = new ConfThirdPart();
            BeanUtils.copyProperties(request, confThirdPart);
            ConfThirdPart result = service.getByPrimaryKey(confThirdPart);
            //主表逻辑删除为1
             service.deleteByPrimaryKeyLogically(confThirdPart);
            //赋值
            result.setSts(request.getSts());
            result.setApplyReason(request.getApplyReason());
            result.setApplierId(request.getAdminOperate().getOperator());
            //插入到申请表
            ConfThirdPartApply confThirdPartApply = new ConfThirdPartApply();
            BeanUtils.copyProperties(result, confThirdPartApply);
            confThirdPartApply.setAuditSts(0);
            confThirdPartApply.setCurrentAction(1);
            long flag =   services.insertSelective(confThirdPartApply);
            return RestResult.success(flag);
           }
        /**
         * 延期提交
         */
        @PostMapping("/delayApply")
        @ResponseBody
        public RestResult<Long> delayApply(@Validated @RequestBody ConfThirdPartRequest request) throws Throwable{
            log.info("查询冻结与解冻参数入参，{}", JSONObject.toJSONString(request));
            //根据id查询到信息
            ConfThirdPart confThirdPart = new ConfThirdPart();
            BeanUtils.copyProperties(request, confThirdPart);
            ConfThirdPart result = service.getByPrimaryKey(confThirdPart);

            if(result.getEndTime().getTime() >= request.getEndTime().getTime()){
                throw new AppRuntimeException(ResponseCode.EXCEPTION, "延期时间需大于活动结束时间");
            }
            //主表逻辑删除为1
            service.deleteByPrimaryKeyLogically(confThirdPart);
            //赋值
            result.setEndTime(request.getEndTime());
            result.setApplyReason(request.getApplyReason());
            result.setApplierId(request.getAdminOperate().getOperator());
            //插入到申请表
            ConfThirdPartApply confThirdPartApply = new ConfThirdPartApply();
            BeanUtils.copyProperties(result, confThirdPartApply);
            confThirdPartApply.setCurrentAction(1);
            confThirdPartApply.setAuditSts(0);
            long flag =   services.insertSelective(confThirdPartApply);
            return RestResult.success(flag);
        }
    /**
     * 提前提交
     */
    @PostMapping("/advanceApply")
    @ResponseBody
    public RestResult<Long> advanceApply(@Validated @RequestBody ConfThirdPartRequest request) throws Throwable{
        log.info("查询冻结与解冻参数入参，{}", JSONObject.toJSONString(request));
        //根据id查询到信息
        ConfThirdPart confThirdPart = new ConfThirdPart();
        BeanUtils.copyProperties(request, confThirdPart);
        ConfThirdPart result = service.getByPrimaryKey(confThirdPart);
        if(result.getEndTime().getTime() <= request.getEndTime().getTime()){
            throw new AppRuntimeException(ResponseCode.EXCEPTION, "提前时间需小于活动结束时间");
        }
        //主表逻辑删除为1
        service.deleteByPrimaryKeyLogically(confThirdPart);
        //赋值

        result.setEndTime(request.getEndTime());
        result.setApplyReason(request.getApplyReason());
        result.setApplierId(request.getAdminOperate().getOperator());
        //插入到申请表
        ConfThirdPartApply confThirdPartApply = new ConfThirdPartApply();
        BeanUtils.copyProperties(result, confThirdPartApply);
        confThirdPartApply.setCurrentAction(1);
        confThirdPartApply.setAuditSts(0);
        long flag =   services.insertSelective(confThirdPartApply);
        return RestResult.success(flag);
    }
}

	
